﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TSU.FAMC.ComputerEngineering.Classes.BooleanMaths.Functions;
using TSU.FAMC.ComputerEngineering.Classes.BooleanMaths.Functions.Readers;

namespace TestVectorNumberReduction
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog2.ShowDialog();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // Verifying tests
            if (openFileDialog1.FileNames.Length == 0 || openFileDialog2.FileNames.Length == 0)
            {
                MessageBox.Show("Выберите и исходные и сокращенные системы!");
                return;
            }

            if (openFileDialog1.FileNames.Length != openFileDialog2.FileNames.Length)
            {
                MessageBox.Show("Должны быть выбраны идентичные наборы систем!");
                return;
            }


            // reading files
            reportBox.Clear();
            var errorsCounter = 0;
            var successFiles = new List<String>();
            for (var i = 0; i < openFileDialog1.FileNames.Length; i++)
            {
                var originalFileName = openFileDialog1.FileNames[i];
                var reducedFileName = openFileDialog2.FileNames[i];

                var fileStr = String.Empty;


                // reading original system
                var fileName = originalFileName;
                try
                {
                    // reading file
                    var streamReader = new StreamReader(fileName);
                    fileStr = streamReader.ReadToEnd();
                }
                catch (Exception ex)
                {
                    reportBox.Text += string.Format("{0}.\r\n Ошибка: не удалось прочитать файл исходной системы. Подрбнее: {1} \r\n\r\n", fileName, ex.Message);
                    errorsCounter++;
                    continue;
                }

                // reading system

                var originalSystem = new BooleanSystem();

                var reader = new BooleanSystemReaderPlafd();
                reader.Input = fileStr;
                reader.System = originalSystem;

                try
                {
                    reader.Read();
                }
                catch (Exception ex)
                {
                    reportBox.Text += string.Format("{0}.\r\n Ошибка: не удалось прочитать исходную систему. Подрбнее: {1} \r\n\r\n", fileName, ex.Message);
                    errorsCounter++;
                    continue;
                }


                // reading reduced system
                fileName = reducedFileName;
                try
                {
                    // reading file
                    var streamReader = new StreamReader(fileName);
                    fileStr = streamReader.ReadToEnd();
                }
                catch (Exception ex)
                {
                    reportBox.Text += string.Format("{0}.\r\n Ошибка: не удалось прочитать файл сокращенной системы. Подрбнее: {1} \r\n\r\n", fileName, ex.Message);
                    errorsCounter++;
                    continue;
                }

                // reading system

                var reducedSystem = new BooleanSystem();
                reader.Input = fileStr;
                reader.System = reducedSystem;

                try
                {
                    reader.Read();
                }
                catch (Exception ex)
                {
                    reportBox.Text += string.Format("{0}.\r\n Ошибка: не удалось прочитать сокращенную систему. Подрбнее: {1} \r\n\r\n", fileName, ex.Message);
                    errorsCounter++;
                    continue;
                }


                // comparing systems
                if (!originalSystem.IsRealizationOf(reducedSystem))
                {
                    reportBox.Text += string.Format("{0}.\r\n Ошибка: сокращенная система не является реализацией исходной системы. \r\n\r\n", Path.GetFileName(reducedFileName));
                    errorsCounter++;
                    continue;
                }


                // saving success file name
                successFiles.Add(fileName);

                reportBox.Text += string.Format("{0}.\r\n Успех: система успешно проверена. \r\n\r\n", Path.GetFileName(originalFileName));
            }


            if (errorsCounter == 0)
            {
                MessageBox.Show("Проверка систем завершена успешно!");
            }
            else
            {
                MessageBox.Show(string.Format("Во время проверки систем возникло {0} ошибок", errorsCounter));
            }
        }
    }
}
